home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 101-125 / 118 / empire / src / source.zoo / startup.d < prev    next >
Text File  |  1987-12-02  |  11KB  |  489 lines

  1. #include:exec/tasks.g
  2. #include:util.g
  3. #include:libraries/dos.g
  4. #empire.g
  5. #empfunc.g
  6.  
  7. Handle_t Stdout;
  8. uint Seed;
  9.  
  10. /*
  11.  * gotControlC - return 'true' if the user has typed a control-C.
  12.  */
  13.  
  14. proc gotControlC()bool:
  15.  
  16.     if
  17.     if UsingSerial then
  18.         serialGotControlC()
  19.     else
  20.         SetSignal(0, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C ~= 0
  21.     fi
  22.     then
  23.     writeln(PromptOut;);
  24.     writeln(PromptOut; "Interrupt!!!");
  25.     true
  26.     else
  27.     false
  28.     fi
  29. corp;
  30.  
  31. /*
  32.  * pause - delay for the given number of tenths of a second.
  33.  */
  34.  
  35. proc pause(uint time)void:
  36.  
  37.     if time ~= 0 then
  38.     Delay(time * 5);
  39.     fi;
  40. corp;
  41.  
  42. /*
  43.  * writeChar - do an unbuffered write of the single character to the output.
  44.  */
  45.  
  46. proc writeChar(char ch)void:
  47.  
  48.     if UsingSerial then
  49.     serialPutChar(ch);
  50.     else
  51.     pretend(Write(Stdout, pretend(&ch, *byte), 1), void);
  52.     fi;
  53. corp;
  54.  
  55. /*
  56.  * writeString - write an entire string immediately.
  57.  */
  58.  
  59. proc writeString(*char st)void:
  60.  
  61.     while st* ~= '\e' do
  62.     writeChar(st*);
  63.     st := st + sizeof(char);
  64.     od;
  65. corp;
  66.  
  67. /*
  68.  * getPassword - prompt for and check the current user's password.
  69.  */
  70.  
  71. proc getPassword(*char prompt, existingPassword)bool:
  72.     [PASSWORD_LEN] char password;
  73.     uint j;
  74.     char CSI = '\(0x9b)';
  75.     bool ok;
  76.  
  77.     write(Chout; prompt);
  78.     if UsingSerial then
  79.     serialEcho(false);
  80.     else
  81.     write("\(CSI)30;40m");
  82.     fi;
  83.     ok := readLine(&password[0], PASSWORD_LEN);
  84.     if UsingSerial then
  85.     serialEcho(true);
  86.     else
  87.     write("\(CSI)31;40m");
  88.     fi;
  89.     if not ok then
  90.     pretend(ioerror(Chin), void);
  91.     false
  92.     elif CharsEqual(&password[0], existingPassword) then
  93.     true
  94.     else
  95.     write(Chout; "Password incorrect. ");
  96.     false
  97.     fi
  98. corp;
  99.  
  100. /*
  101.  * printFile - print a file (if it exists).
  102.  */
  103.  
  104. proc printFile(*char fileName)void:
  105.     channel input text tempChan;
  106.     file() tempFile;
  107.  
  108.     if open(tempChan, tempFile, fileName) then
  109.     while readln(tempChan; &InputBuffer[0]) do
  110.         writeln(Chout; &InputBuffer[0]);
  111.     od;
  112.     close(tempChan);
  113.     fi;
  114. corp;
  115.  
  116. /*
  117.  * getVerifiedPassword - get a new password for the country. Verify it.
  118.  *    return 'true' if it is verified, else 'false'. If we get it, install
  119.  *    into the user structure.
  120.  */
  121.  
  122. proc getVerifiedPassword(*char prompt)bool:
  123.     char CSI = '\(0x9b)';
  124.     [PASSWORD_LEN] char password, verifyPassword;
  125.     bool aborting;
  126.  
  127.     write(Chout; "Enter new password: ");
  128.     if UsingSerial then
  129.     serialEcho(false);
  130.     else
  131.     write("\(CSI)30;40m");
  132.     fi;
  133.     aborting := not readLine(&password[0], PASSWORD_LEN);
  134.     if UsingSerial then
  135.     serialEcho(true);
  136.     else
  137.     write("\(CSI)31;40m");
  138.     fi;
  139.     if not aborting then
  140.     write(Chout; "Re-enter password to verify: ");
  141.     if UsingSerial then
  142.         serialEcho(false);
  143.     else
  144.         write("\(CSI)30;40m");
  145.     fi;
  146.     aborting := not readLine(&verifyPassword[0], PASSWORD_LEN);
  147.     if UsingSerial then
  148.         serialEcho(true);
  149.     else
  150.         write("\(CSI)31;40m");
  151.     fi;
  152.     if not aborting and CharsEqual(&password[0], &verifyPassword[0]) then
  153.         ThisCountry*.c_password := password;
  154.         true
  155.     else
  156.         writeln(Chout; "Password not verified.");
  157.         false
  158.     fi
  159.     else
  160.     false
  161.     fi
  162. corp;
  163.  
  164. /*
  165.  * putPrompt - print a prompt to the local system owner.
  166.  */
  167.  
  168. proc putPrompt()void:
  169.  
  170.     pretend(Write(Stdout, pretend("E > ", *byte), 4), void);
  171. corp;
  172.  
  173. /*
  174.  * playGame - play a session of the game. Return 'true' if have output a
  175.  *    message line to the console during a serial connection.
  176.  */
  177.  
  178. proc playGame()bool:
  179.     [NAME_LEN] char name;
  180.     [25] char buf;
  181.     uint i, j, k;
  182.     bool aborting, dirty;
  183.  
  184.     dirty := false;
  185.     writeln(Chout; "           Welcome to Amiga Empire Version 1.0!!");
  186.     writeln(Chout; "                       by Chris Gray");
  187.     writeln(Chout;);
  188.     writeln(Chout;);
  189.     printFile(CONNECT_MESSAGE_FILE);
  190.     openFile();
  191.     readWorld();
  192.     write(Chout; "Enter country name: ");
  193.     aborting := not readLine(&name[0], NAME_LEN);
  194.     if not aborting then
  195.     j := 0;
  196.     while name[j] = ' ' do
  197.         j := j + 1;
  198.     od;
  199.     aborting := name[j] = '\e';
  200.     fi;
  201.     if not aborting then
  202.     i := 0;
  203.     while i ~= World.w_currCountries and
  204.         not CharsEqual(&name[j], &Country[i].c_name[0]) do
  205.         i := i + 1;
  206.     od;
  207.     if i = World.w_currCountries then
  208.         writeln(Chout; "Country ", &name[j], " does not exist.");
  209.         if World.w_currCountries = World.w_maxCountries then
  210.         writeln(Chout; "There is no space for more countries.");
  211.         aborting := true;
  212.         elif ask("Do you wish to create it? ") then
  213.         if getPassword("Enter creation password for this game: ",
  214.                    &World.w_password[0]) then
  215.             ThisCountryNumber := i;
  216.             ThisCountry := &Country[ThisCountryNumber];
  217.             if getVerifiedPassword("Enter new password: ") then
  218.             k := 0;
  219.             while
  220.                 ThisCountry*.c_name[k] := name[j];
  221.                 name[j] ~= '\e'
  222.             do
  223.                 k := k + 1;
  224.                 j := j + 1;
  225.             od;
  226.             World.w_currCountries := World.w_currCountries + 1;
  227.             ThisCountry*.c_status := cs_active;
  228.             ThisCountry*.c_last := CurrentTime();
  229.             pretend(resetTimer(), void);
  230.             writeWorld();
  231.             else
  232.             aborting := true;
  233.             fi;
  234.         else
  235.             writeln(Chout; "Restart to try again.");
  236.             aborting := true;
  237.         fi;
  238.         else
  239.         writeln(Chout; "OK.");
  240.         aborting := true;
  241.         fi;
  242.     else
  243.         ThisCountryNumber := i;
  244.         ThisCountry := &Country[ThisCountryNumber];
  245.         if not getPassword("Enter password: ",
  246.                    &ThisCountry*.c_password[0]) then
  247.         writeln(Chout; "Try again.");
  248.         if not getPassword("Enter password: ",
  249.                    &ThisCountry*.c_password[0]) then
  250.             writeln(Chout; "Try again.");
  251.             if not getPassword("Enter password: ",
  252.                        &ThisCountry*.c_password[0]) then
  253.             writeln(Chout; "Aborting.");
  254.             aborting := true;
  255.             fi;
  256.         fi;
  257.         fi;
  258.     fi;
  259.     if not aborting then
  260.         ConvTime(CurrentTime(), &buf[0]);
  261.         if UsingSerial then
  262.         writeln(&buf[0], " - country ", &name[0], " logged in.");
  263.         putPrompt();
  264.         fi;
  265.         writeln(LogChannel; &buf[0], " - country ", &name[0],
  266.             " logged in.");
  267.         ConvTime(ThisCountry*.c_last, &buf[0]);
  268.         writeln(Chout; &name[0], " last on at ", &buf[0]);
  269.         if resetTimer() then
  270.         write(Chout; "Sorry, you are out of time for today.");
  271.         writeln(Chout; " Come back tomorrow.");
  272.         else
  273.         printFile(LOGIN_MESSAGE_FILE);
  274.         processCommands();
  275.         World.w_lastRun := CurrentTime();
  276.         writeWorld();
  277.         fi;
  278.         ConvTime(CurrentTime(), &buf[0]);
  279.         writeln(LogChannel; &buf[0], " - country ",
  280.             &ThisCountry*.c_name[0], " logged out.");
  281.         if UsingSerial then
  282.         writeln();
  283.         writeln(&buf[0], " - country ",
  284.             &ThisCountry*.c_name[0], " logged out.");
  285.         dirty := true;
  286.         fi;
  287.     fi;
  288.     fi;
  289.     closeFile();
  290.     close(LogChannel);
  291.     if not open(LogChannel, LogFile, LOG_FILE) then
  292.     writeln("Can't reopen ", LOG_FILE, " for output.");
  293.     exit(1);
  294.     fi;
  295.     if not TextAppend(LogChannel) then
  296.     writeln("Can't reappend to ", LOG_FILE, '.');
  297.     close(LogChannel);
  298.     exit(1);
  299.     fi;
  300.     dirty
  301. corp;
  302.  
  303. /*
  304.  * shout - shout an important warning on the console.
  305.  */
  306.  
  307. proc shout(*char message)void:
  308.     char CSI = '\(0x9b)';
  309.     uint i;
  310.  
  311.     writeln("\(CSI)30;41m ",        /* why is the extra space needed? */
  312.     "                                      "
  313.     "                                      ");
  314.     writeln(
  315.     "                                      "
  316.     "                                      ");
  317.     writeln(
  318.     "                                      "
  319.     "                                      ");
  320.     write("**** ");
  321.     i := 0;
  322.     while message* ~= '\e' do
  323.     write(message*);
  324.     message := message + 1;
  325.     i := i + 1;
  326.     od;
  327.     write("!!! ****");
  328.     while i < 63 do
  329.     i := i + 1;
  330.     write(' ');
  331.     od;
  332.     writeln();
  333.     writeln(
  334.     "                                      "
  335.     "                                      ");
  336.     writeln(
  337.     "                                      "
  338.     "                                      ");
  339.     writeln(
  340.     "                                      "
  341.     "                                      ",
  342.     "\(CSI)31;40m");
  343. corp;
  344.  
  345. /*
  346.  * main - the main program.
  347.  */
  348.  
  349. proc main()void:
  350.     DateStamp_t ds;
  351.     *char par;
  352.     ulong now;
  353.     [80] char buf;
  354.  
  355.     Stdout := Output();
  356.     if not IsInteractive(Input()) or not IsInteractive(Stdout) then
  357.     writeln("Empire's standard I/O must not be redirected.");
  358.     exit(1);
  359.     fi;
  360.     DateStamp(&ds);
  361.     Seed := (ds.ds_Minute >< ds.ds_Tick) | 1;
  362.     SerialOpen := false;
  363.     if not open(LogChannel, LogFile, LOG_FILE) then
  364.     if not FileCreate(LOG_FILE) then
  365.         writeln("Can't create ", LOG_FILE);
  366.         exit(1);
  367.     fi;
  368.     if not open(LogChannel, LogFile, LOG_FILE) then
  369.         writeln("Can't open ", LOG_FILE, " for output.");
  370.         exit(1);
  371.     fi;
  372.     fi;
  373.     if not TextAppend(LogChannel) then
  374.     writeln("Can't append to ", LOG_FILE, '.');
  375.     close(LogChannel);
  376.     exit(1);
  377.     fi;
  378.     openFile();
  379.     readWorld();
  380.     closeFile();
  381.     now := CurrentTime();
  382.     if now < World.w_lastRun then
  383.     shout("Current time is earlier than last run time");
  384.     elif now > World.w_lastRun + (24 * 60 * 60) then
  385.     shout("Current time is more than one day after last run time");
  386.     fi;
  387.     SectorChar := SECTOR_CHAR;
  388.     ShipChar := SHIP_CHAR;
  389.     ItemChar := ITEM_CHAR;
  390.     par := GetPar();
  391.     if par ~= nil then
  392.     if not CharsEqual(par, "private") then
  393.         writeln("Invalid parameter - only 'private' accepted.");
  394.         close(LogChannel);
  395.         exit(1);
  396.     fi;
  397.     open(Chin);
  398.     open(Chout);
  399.     open(PromptOut);
  400.     UsingSerial := false;
  401.     pretend(playGame(), void);
  402.     else
  403.     if not openSerialHandler() then
  404.         writeln("Can't open serial port.");
  405.         close(LogChannel);
  406.         exit(1);
  407.     fi;
  408.     SerialOpen := true;
  409.     LeaveGame := false;
  410.     PlayConsole := false;
  411.     putPrompt();
  412.     while not LeaveGame do
  413.         if PlayConsole then
  414.         PlayConsole := false;
  415.         setDTRoff();
  416.         open(Chin);
  417.         open(Chout);
  418.         open(PromptOut);
  419.         UsingSerial := false;
  420.         writeln(Chout;);
  421.         writeln(Chout;);
  422.         pretend(playGame(), void);
  423.         setDTRon();
  424.         putPrompt();
  425.         elif WaitForChar(Input(), 1000000) then
  426.         readln(&buf[0]);
  427.         if CharsEqual(&buf[0], "QUIT") then
  428.             LeaveGame := true;
  429.         elif CharsEqual(&buf[0], "play") then
  430.             setDTRoff();
  431.             open(Chin);
  432.             open(Chout);
  433.             open(PromptOut);
  434.             UsingSerial := false;
  435.             writeln(Chout;);
  436.             writeln(Chout;);
  437.             pretend(playGame(), void);
  438.             setDTRon();
  439.             putPrompt();
  440.         elif buf[0] = '\e' then
  441.             putPrompt();
  442.         else
  443.             writeln("Unknown command - only 'QUIT' and 'play' known.");
  444.             putPrompt();
  445.         fi;
  446.         elif serialActive() then
  447.         writeln();
  448.         ConvTime(CurrentTime(), &buf[0]);
  449.         writeln(&buf[0], " - ", serialSpeed(),
  450.             " baud connection established on serial port.");
  451.         writeln(LogChannel; &buf[0], " - ", serialSpeed(),
  452.             " baud connection established on serial port.");
  453.         open(Chin, serialGetChar);
  454.         open(Chout, serialPutChar);
  455.         open(PromptOut, serialPutChar);
  456.         UsingSerial := true;
  457.         if not playGame() then
  458.             writeln();
  459.         fi;
  460.         setDTRoff();
  461.         ConvTime(CurrentTime(), &buf[0]);
  462.         writeln(&buf[0], " - connection terminated on serial port.");
  463.         writeln(LogChannel; &buf[0],
  464.             " - connection terminated on serial port.");
  465.         pause(50);
  466.         setDTRon();
  467.         putPrompt();
  468.         fi;
  469.     od;
  470.     closeSerialHandler();
  471.     fi;
  472.     close(LogChannel);
  473. corp;
  474.     
  475. /*
  476.  * random - return a random number 0 - passed range.
  477.  */
  478.  
  479. proc random(uint rang)uint:
  480.  
  481.     if rang = 0 then
  482.     0
  483.     else
  484.     Seed := Seed * 17137 + 4287;
  485.     Seed := (Seed >> 8) >< (Seed << 8);
  486.     Seed % rang
  487.     fi
  488. corp;
  489.